package signx

import (
	"codeup.aliyun.com/lsxd/zltx/adapter/utils/formater"
	"codeup.aliyun.com/lsxd/zltx/adapter/utils/signx/hash"
)

// VerifyFunc 验证签名函数类型
type VerifyFunc func(data, sign, key string, opts ...string) (bool, error)

func defaultVerifyOptions() *options {
	return &options{
		signFn:   hash.Md5,
		formatFn: formater.HexLower,
		verifyFn: nil,
	}
}

// Verify 验证签名
func Verify(opts ...Option) (bool, error) {
	opt := defaultVerifyOptions()
	for _, o := range opts {
		o(opt)
	}

	// 如果定义了验证函数，则直接调用
	if opt.verifyFn != nil {
		signStr, err := opt.formatFn.Decode(opt.signed)
		if err != nil {
			return false, err
		}
		return opt.verifyFn(opt.data, string(signStr), opt.key, opt.args...)
	}

	// 签名
	// 没有定义验证函数，则使用签名函数生成签名值，然后进行比较
	sign, err := opt.signFn(opt.data, opt.key, opt.args...)
	if err != nil {
		return false, err
	}

	// 格式化并比较签名值
	signStr := opt.formatFn.Encode(sign)
	return opt.signed == signStr, nil
}
